package cfdt.ldl.web.util;

import cn.hutool.core.util.StrUtil;
import cfdt.common.enums.CommonCodeEnum;
import cfdt.common.jwt.JwtClaims;
import cfdt.common.jwt.JwtToken;
import cfdt.common.jwt.JwtUtil;
import cfdt.common.exception.CodeException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Map;

/**
 * <pre>
 * Modify Information:
 * Author       Date          Description
 * ============ ============= ============================
 * sulizhao      2020年11月11日
 * </pre>
 */
public final class WebTokenUtil {

    private static final Logger logger = LoggerFactory.getLogger(WebTokenUtil.class.getName());

    /**
     * 私有构造方法
     */
    private WebTokenUtil(){}

    private static final String USER_ID = "userId";

    /**
     * 生成token
     */
    public static String generateToken(String userId, String secret) {
        //可以把任何安全的数据放到map里面
        JwtClaims jwtClaims = new JwtClaims();
        jwtClaims.put(USER_ID, userId);
        // 生成token
        return JwtUtil.generateToken(jwtClaims, secret);
    }

    /**
     * 校验token
     */
    public static void validateToken(String token, Map<String, Object> redisValMap, String secret) {
        if (StrUtil.hasEmpty(token, secret)) {
            logger.error("token: "+token);
            throw new CodeException(CommonCodeEnum.CODE_0004);
        }
        if (redisValMap == null) {
            throw new CodeException(CommonCodeEnum.CODE_0007);
        }

        // 解析校验token
        JwtUtil.parseToken(token, secret);
        // 比对token
        String serverToken = (String) redisValMap.get("Token");
        boolean flag = StrUtil.equalsIgnoreCase(token, serverToken);
        // token不正确则报错
        if (!flag) {
            throw new CodeException(CommonCodeEnum.CODE_0005);
        }
    }

    /**
     * 获取用户ID
     * @param token
     * @param secret
     * @return
     * @throws CodeException
     */
    public static String getUserId(String token, String secret) {
        // 解析token
        JwtToken jwtToken = JwtUtil.parseToken(token, secret);
        // 获取业务参数
        Map<String, Object> claims = jwtToken.getClaims().getClaims();
        // 获取用户ID
        return (String) (claims.get(USER_ID));
    }


}